package ru.spb.nicetu.altx.mnemo.extpoint.valuetypes;

import java.io.Serializable;

import ru.spb.nicetu.altx.mnemo.math.managers.PerformanceManager;

/**
 * Абстрактный класс "Именованный Класс-Обертка". <br>
 * Реализует методы сохранения значения. <br>
 * Потомкам необходимо конкретизировать класс значения и дать Обертке имя
 * (символическое имя "ТипЗначения").
 * 
 * @author serg
 * @param <E>
 *          - оборачиваемый класс.
 */
@SuppressWarnings({"serial", "unchecked"})
public abstract class ATemplateValueType<E> implements ITemplateValueType<E>{

  protected E value;
  
  public ATemplateValueType() {
  // зарегистрируем себя для анализа расходования памяти
    PerformanceManager.getInstance().registerValue(this);
  }

  public ATemplateValueType(E value) {
    this();
    this.value = value;
  }

  
  public E get() {
    return value;
  }

  
  public Class getType() {
    return value.getClass();
  }

  
  public void set(E value) {
    this.value = value;
  }

  
  public String getTypeName() {
    return getType().getName();
  }

  public ITemplateValueType<E> clone() {
    ATemplateValueType clone = null;

    try {
      clone = this.getClass().newInstance();
      clone.set(getValueForClone());
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return clone;

  }

  protected E getValueForClone() {
    return this.value;
  }

}
